/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logicaNegocio;

import dtos.DTOSesion;
import java.util.ArrayList;
import java.util.List;
import persistencia.Criterio;
import persistencia.Criterio.OperadorRelacionalEnum;
import persistencia.FabricaCriterio;
import persistencia.FachadaPersistencia;
import persistencia.agente.FichaInternacion;
import persistencia.agente.FichaInternacionAgente;
import persistencia.agente.Paciente;
import persistencia.agente.PacienteAgente;

/**
 *
 * @author Sebastian
 */
public class VariablesSesion {

    private static VariablesSesion instancia;
    private List<DTOSesion> sesiones;


    private VariablesSesion() {
    }

    public static synchronized VariablesSesion getInstancia() {
        if (instancia == null) {
            instancia = new VariablesSesion();
        }
        return instancia;
    }

    private FichaInternacion obtenerUltimaFichaInternacion(Paciente paciente) {
        FichaInternacion ultima = null;
        List<FichaInternacion> fichasPaciente = null;

        for (FichaInternacion fichaInternacion : FachadaPersistencia.getInstancia().buscar(FichaInternacion.class, null)) {
            if (((FichaInternacionAgente) fichaInternacion).getOidPaciente().equals(((PacienteAgente) paciente).getOid())) {
                if (fichasPaciente == null) {
                    fichasPaciente = new ArrayList<FichaInternacion>();
                }
                fichasPaciente.add(fichaInternacion);
            }
        }
        if (fichasPaciente != null && !fichasPaciente.isEmpty()) {
            ultima = fichasPaciente.get(0);
            for (FichaInternacion fichaInternacion : fichasPaciente) {
                if (fichaInternacion.getFechaIngreso().compareTo(ultima.getFechaIngreso()) > 0) {
                    ultima = fichaInternacion;
                }
            }
        }
        return ultima;
    }

    private List<DTOSesion> getSesiones() {
        if (sesiones == null) {
            sesiones = new ArrayList<DTOSesion>();
        }
        return sesiones;
    }

    private void addSesion(String usuario, String contrasenia, int idControlador, int nroFichaInternacion) {
        boolean actualizo = false;

        for (DTOSesion dTOSesion : getSesiones()) {
            if (dTOSesion.getNombreUsuario().trim().equals(usuario.trim())) {
//                dTOSesion.setIdControlador(idControlador);
                actualizo = true;
            }
        }
        if (!actualizo) {
            getSesiones().add(new DTOSesion(usuario, contrasenia, idControlador, nroFichaInternacion));
        }
    }

    public int getIdControlador(String usuario) {
        int resultado = -1;
        for (DTOSesion dTOSesion : getSesiones()) {
            if (dTOSesion.getNombreUsuario().trim().equals(usuario.trim())) {
                resultado = dTOSesion.getIdControlador();
            }
        }
        return resultado;
    }

    public void cerrarSesion(int idControlador) {
        DTOSesion sesion = null;
        for (DTOSesion dTOSesion : getSesiones()) {
            if (dTOSesion.getIdControlador() == idControlador) {
                sesion = dTOSesion;
            }
        }
        sesiones.remove(sesion);
    }

    public String getUsuario(int id) {
        String usuario = null;
        for (DTOSesion dTOSesion : sesiones) {
            if (dTOSesion.getIdControlador() == id) {
                usuario = dTOSesion.getNombreUsuario();
            }
        }
        return usuario;
    }

    public int validarLogin(String usuario, String contrasenia, int idControlador) {
        Criterio criterio = FabricaCriterio.getInstancia().obtenerCriterio("dni", OperadorRelacionalEnum.Igual.getString(), usuario.trim(), true);
        criterio = FabricaCriterio.getInstancia().agregarCriterio(criterio, Criterio.OperadorLogicoEnum.Conjuncion.getString(), "contrasenia", OperadorRelacionalEnum.Igual.getString(), contrasenia, true);
        List<Paciente> pacientes = FachadaPersistencia.getInstancia().buscar(Paciente.class, criterio);
        FichaInternacion ultimaFicha;

        int codigoError = 0;

        if (pacientes != null && !pacientes.isEmpty()) {
            ultimaFicha = obtenerUltimaFichaInternacion(pacientes.get(0));
            if (ultimaFicha != null && ultimaFicha.getEstado() != null && ultimaFicha.getEstado().getNombreEstadoFicha().equals("Vigente")) {
//                if (ultimaFicha != null){
                if (sesiones != null && !sesiones.isEmpty()) {
                    for (DTOSesion dTOSesion : sesiones) {
                        if (dTOSesion.getNombreUsuario().equals(usuario)) {
                            codigoError = 3;
                        }
                    }
                }

                addSesion(usuario, contrasenia, idControlador, (((FichaInternacionAgente) ultimaFicha).getNroFicha()));
                
            }else{
                codigoError = 2;
            }
        }else{
            codigoError = 1;
        }
        
        return codigoError;
    }

    public DTOSesion getSesion(int idControlador) {
//        System.out.println("Session solicitada: "+idControlador);
//        System.out.println("Cantidad de sesiones activas: "+sesiones.size());
        DTOSesion resultado = null;
        for (DTOSesion dTOSesion : sesiones) {
            if (dTOSesion.getIdControlador() == idControlador) {
//                System.out.println("sesion encontrada");
                resultado = dTOSesion;
            }
        }
        return resultado;
    }
}
